package com.common;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;

import com.index.Indexer;
import com.search.Searcher;

public class Main {

	static final int DEFAULT_PAGE_SIZE = 20;

	/**
	 * Metodo que recibe los arumentos de entrada, crea una instancia dle objeto
	 * Searcher y lo manda a buscar al índice con los parámetros recibidos.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);

		String opcion = getFirstOption(br);

		if (opcion.equals("2")) {
			searchInput(br);

		} else {
			Indexer i = new Indexer();
			i.index();
			System.out.println();
		}

		searchCycle(br);

		try {
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void searchCycle(BufferedReader br) {
		
		String opcion = "";
		
		while (opcion == null || opcion.trim().length() == 0
				|| opcion.equalsIgnoreCase("y")) {

			System.out.println("desea realizar una nueva búsqueda? Y/N");
			try {
				opcion = br.readLine();
			} catch (IOException ex) {
				System.err
						.println("No se pudo leer por alguna razon pacheca...");
			}

			if (opcion == null || !opcion.trim().equalsIgnoreCase("Y")
					&& !opcion.trim().equalsIgnoreCase("N")) {
				opcion = "";
				System.out.println("opcion no valida");

			} else if (opcion != null && opcion.trim().equalsIgnoreCase("Y"))
				searchInput(br);
		}
	}

	private static String getFirstOption(BufferedReader br) {
		String opcion = "";
		while (opcion == null || opcion.trim().length() == 0) {
			System.out.println("ingrese el número de la operación a realizar:");
			System.out.println("\t1)Indexar.");
			System.out.println("\t2)Buscar.");

			try {
				opcion = br.readLine();
			} catch (IOException ex) {
				System.err
						.println("No se pudo leer por alguna razon pacheca...");
			}

			if (opcion == null || !opcion.trim().equals("1")
					&& !opcion.trim().equals("2")) {
				opcion = "";
				System.out.println("opcion no valida");

			}
		}
		return opcion;
	}

	private static void searchInput(BufferedReader br) {
		String input = "";
		while (input == null || input.trim().length() == 0) {
			System.out.println("Ingrese un valor para la búsqueda:");
			try {
				input = br.readLine();
			} catch (IOException ex) {
				System.err
						.println("No se pudo leer por alguna razon pacheca...");
			}
			if (input == null || input.trim().length() == 0)
				System.out.println("input vacío");
		}

		int pageSize = DEFAULT_PAGE_SIZE;

		System.out.println("Ingrese un tamaño de pagina:");
		try {
			String aux = br.readLine();

			try {
				Integer i = new Integer(aux);
				pageSize = i.intValue();
			} catch (NumberFormatException nfException) {
				// do nothing. We use default value.
			}
		} catch (IOException ex) {
			System.err.println("No se pudo leer por alguna razon pacheca...");
		}
		Searcher s = new Searcher();

		try {
			// Realizar la búsqueda.
			int totalResultados = s.search(input, pageSize);
			System.out.println("Numero de resultados: " + totalResultados);
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}